package jdbc;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;

/**
 * 执行预编译SQL语句
 * 优点:
 * 1:避免了繁琐的拼接SQL语文
 * 2:避免了被SQL注入的问题
 * 3:大批量执行相同语义的SQL(语义相同,值不同)时性能好
 *
 * 实际开发中我们的CRUD都建议使用预编译SQL来执行
 */
public class JDBCDemo5 {
    public static void main(String[] args) {
        try (
                Connection conn = DBUtil.getConnection();
        ){
            //向userinfo表中插入数据
            String sql = "INSERT INTO userinfo " +
                         "(username,password,nickname,age) " +
                         "VALUES " +
                         "(?,?,?,?)";//预编译SQL中可以先用"?"代替值
            /*
                此时Connection会现将该SQL发送给数据库,使其生成该SQL的
                执行计划,表明该SQL的语义.
                数据库理解了,要向userinfo表插入数据,并且对4个字段插入内容
                只不过该SQL不能真正执行,因为还没有数据.
             */
            PreparedStatement ps = conn.prepareStatement(sql);
            //使用PreparedStatement为四个预留的"?"设置应有的值
            ps.setString(1,"王克晶");//第1个?的值为字符串类型的"王克晶"
            ps.setString(2,"123456");
            ps.setString(3,"克晶");
            ps.setInt(4,18);//第4个?的值为int类型的数字18
            //此时执行时仅将4个?对应的值传递给数据库
            int count = ps.executeUpdate();
            if(count>0){
                System.out.println("插入成功");
            }




        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}
